package cn.tedu.thread;
/**本类用来测试多线程的编程方式一  extends  Thead */
public class Thread1 {
    public static void main(String[] args) {
        /*如果只是调用两个线程的run（）方法，那么会先执行完一个线程，再执行另一个线程
        * 不会有多线程抢占资源的效果，所以我们真的能通过run（）来执行多线程方法吗？*/
        /*run()与start（）本质上的区别，run（）只能当做一个顺序执行的单线程普通方法
        * 并没有多线程抢占的效果，所以，如果想以多线程的效果干活，必须调用start（）
        * 才能真正的启动线程*/
        //5.创建自定义线程类对象
        MyThread t = new MyThread();/*new 对应的是新建状态*/
        //6.模拟多线程，需要至少启动2个线程，如果只启动一个线程，是单线程程序
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread("旺财");
//        t.run();
//        t2.run();
        /*当我们调用start（）启动线程时，虚拟机会自动调用run（）的业务*/
        t.start();/*对应的是就绪状态*/
        t2.start();
        t3.start();
        /*测试结果：
        * 线程有随机性，执行的结果是不可控的，因为这是CPU在调度，我们无法控制
        * */


    }
}
//1.自定义多线程类
class MyThread extends Thread{
    public MyThread(){
    }
    public MyThread(String name){
        //调用父类的含参构造，将线程名传给Thread
        super(name);
    }

    //2.1线程中的业务必须写在run（）里
    /*父类的实现是我们不需要的，我们有自己的业务*/
//    @Override
//    public void run() {
//        super.run();
//    }
    //重写父类中的run（）
    @Override
    public void run() {
        /*super表示父类对象的引用，也就是使用的是Thread类本身的业务，不用*/
//        super.run();
        //4.
        for(int i = 1;i<11;i++){
            /*getName()可以获取正在执行任务的线程名称，使用的是继承过来的方法*/
            System.out.println(i+"="+getName());
        }

    }


}